<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>值类型</title>
</head>
<body>
    <script>
        //  我们把key 和value 都存储在内置的栈中称为值类型，
        //  值类型赋值的时候相互之间是不影响
      /*    var a = 100;
         var b = a;
         b = 200;
        //  console.log(a);// 100 */

        //  我们把key 变量名，value为内存地址存在 栈中，内存的堆中存储是key 内存地址，
        //  value是真正的值，
        //  var a = {age:100};
        //  var b = a; // 把a的内存地址，赋值给b  a和b 都指向同一块内存（同一个值）
        //  b.age = 200;
        //  console.log(a.age) // 200
        //  值存在堆中是引用类型，值存储在栈中是值类型

        // 常见的值类型：undefined未定义，number数字 ，布尔boolean，字符串string,Symbol 符号
        // 引用类型：object 对象 ，array数组 ，null空指针， funciton函数
        // javascript的数据类型有哪些：ES6：map,set,weakMap,weakSet

        // typeof 能够判断哪些数据类型
    /*     var a = undefined; 
       console.log(typeof a);

       var b = 12;
       console.log(typeof b);

       var c = true;
       console.log(typeof c);

       var d = "love";
       console.log(typeof d);

       var e = Symbol("e");
       console.log(typeof e); */
    // 1.   typeof 能够精确的判断 值类型

     /*    var f = {name:"age"};
        console.log(typeof f);

        var g = [1,2];
        console.log(typeof g);

        var h = null;
        console.log(typeof h);

        var i = function(){}; 
        console.log(typeof i);*/
    // 2. typeof 能判断对象是否为引用类型（不精确）
    // 3. typeof 还能判断数据为一个函数

    // 对待面试题
    // 1. 什么是值类型，什么是引用类型，区别
    // 2. javascript常见的数据类型
    // 3. javascript如果判断数据类型
    // 4. typeof null 的结果是？


var obj1 = {
    name:"mumu",    
    age:18,
    address:{
        provice:"hn",
        city:"zhengzhou",
    },
    arr:["a","b","c"]
}
// 如果深拷贝obj1 ？意思  复制（复制出来的obj2）和obj1 是应该没有关系
// var obj2 = obj1; //直接是引用，根本没有拷贝

// 浅拷贝  通过forin 遍历对象
// var obj2 = {};
// for(let k in obj1){
//     obj2[k]=obj1[k];
// }
function deepClone(obj){
    // 如果对象是数值类型就直接返回，如果是引用类型，开始执行拷贝
    if(typeof obj !=='object'|| obj === null){
        return obj;
    }
    let result;// 返回的结果
    // 如果是数组，返回应该是一个数组
    if(obj instanceof Array){
        result = [];
    }else{
        result = {};
    }
    // 如果是对象，返回一个对象
    // 通过forIn 拷贝这个对象
    // 拷贝的对象值不能是继承的（只拷贝自身的对象属性）
    for(let key in obj){
        if(obj.hasOwnProperty(key)){
            // result[key] = obj[key] 这样写就是浅拷贝了
            result[key] = deepClone(obj[key]);//递归拷贝
        }
    }
    return result; // 返回结果
}
var obj2 = deepClone(obj1);

    </script>
    
</body>
</html>